로딩 중이에요... 🐣
4. admin작성 | ✅ 저자: 이유정(박사)
list_display
,fields
, search_fields
... 이런 변수들은 장고가 공식적으로 제공하는 admin 옵션 변수입니다.
admin.py
from django.contrib import admin
from .models import (
Article,
Restaurant,
RestaurantCategory,
RestaurantImage,
RestaurantMenu,
Review,
ReviewImage,
SocialChannel,
Tag,
)
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = [
"id",
"title",
"show_at_index",
"is_published",
"created_at",
"modified_at",
]
# 개별 객체를 추가하거나 수정할 때 보여줄 필드를 지정함(편집 화면에서 보임)
# Admin에서 글을 생성하거나 수정할 때 이 필드들만 폼에 나타남
fields = ["title", "preview_image", "content", "show_at_index", "is_published"]
search_fields = ["title"]
list_filter = ["show_at_index", "is_published"]
date_hierarchy = "created_at"
actions = ["make_published"]
@admin.action(description="선택한 컬럼을 공개상태로 변경합니다.")
def make_published(self, request, queryset):
queryset.update(is_published=True)
@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):
list_display = ["id", "name"]
fields = ["name"]
search_fields = ["name"]
class RestaurantMenuInline(admin.TabularInline):
model = RestaurantMenu
extra = 1
class RestaurantImageInline(admin.TabularInline):
model = RestaurantImage
extra = 1
@admin.register(Restaurant)
class RestaurantAdmin(admin.ModelAdmin):
list_display = [
"id",
"name",
"branch_name",
"is_closed",
"phone",
"rating",
"rating_count",
]
fields = [
"name",
"branch_name",
"category",
"is_closed",
"phone",
"latitude",
"longitude",
"tags",
]
readonly_fields = ["rating", "rating_count"]
search_fields = ["name", "branch_name"]
list_filter = ["tags"]
autocomplete_fields = ["tags"]
inlines = [RestaurantMenuInline, RestaurantImageInline]
# 인스턴스를 생성할때 인라인 표시 안하도록
def get_inline_instances(self, request, obj=None):
return obj and super().get_inline_instances(request, obj) or []
@admin.register(RestaurantCategory)
class RestaurantCategoryIAdmin(admin.ModelAdmin):
list_display = ["name"]
fields = ["cuisine_type", "name"]
class ReviewImageInline(admin.TabularInline):
model = ReviewImage
extra = 1
@admin.register(Review)
class ReviewAdmin(admin.ModelAdmin):
list_display = ["id", "restaurant_name", "author", "rating", "content_partial"]
inlines = [ReviewImageInline]
# 인스턴스를 생성할때 인라인 표시 안하도록
def get_inline_instances(self, request, obj=None):
return obj and super().get_inline_instances(request, obj) or []
@admin.register(SocialChannel)
class SocialChannelAdmin(admin.ModelAdmin):
list_display = ["id", "name"]
fields = ["name"]
fields = ["title", "preview_image", "content", "show_at_index", "is_published"]
list_display = [ "id", "title", "show_at_index", "is_published", "created_at", "modified_at"]
search_fields = ["title"]
list_filter = ["show_at_index", "is_published"]
date_hierarchy = "created_at"
actions = ["make_published"]
데코레이션이 없는 이유: 이 클래스들은 InlineModelAdmin, 즉 인라인 모델 등록용 클래스입니다. RestaurantMenu는 Restaurant 객체를 수정할 때 같이 나타납니다. 왼쪽 메뉴에 "RestaurantMenu"라는 항목은 아예 없습니다. 대신, 레스토랑 수정 화면 안에 탭 형태로 들어가 있습니다.
class RestaurantMenuInline(admin.TabularInline):
model = RestaurantMenu
extra = 1
class RestaurantImageInline(admin.TabularInline):
model = RestaurantImage
extra = 1
readonly_fields = ["rating", "rating_count"]
search_fields = ["name", "branch_name"]
list_filter = ["tags"]
autocomplete_fields = ["tags"]
# 수정할때만 보여지는 폼
inlines = [RestaurantMenuInline, RestaurantImageInline]
# 수정할 때만 인라인 폼을 보여주고, 새로 생성할 때는 인라인폼을 숨기는 역할
def get_inline_instances(self, request, obj=None):
return obj and super().get_inline_instances(request, obj) or []
readonly_fields = ["rating", "rating_count"]
- 설명: 관리자 페이지에서
rating
,rating_count
필드는 읽기 전용(수정 불가) 으로 표시됩니다. - 용도: 평점과 평점 수는 보통 사용자 활동(리뷰 등)에 따라 자동 계산되므로, 관리자가 직접 입력할 필요가 없기 때문입니다.
- UI: 해당 필드에 입력창 없이 값만 표시됨 (비활성화 상태)
search_fields = ["name", "branch_name"]
- 설명: 관리자 상단의 검색창에서 레스토랑 이름과 지점명으로 검색 가능하게 만듭니다.
- 예시: “강남” 또는 “스테이크” 등으로 검색하면 일치하는 이름/지점이 필터됨
- UI: 검색어 입력 → 결과 필터링됨
list_filter = ["tags"]
- 설명: 오른쪽 사이드바에 필터 목록이 생겨, Tag로 레스토랑을 분류/필터링할 수 있습니다.
- 예시: "맛집" 태그를 클릭하면 해당 태그가 달린 레스토랑만 목록에 표시됨
- UI: 우측에 체크박스/옵션 필터링 메뉴가 생김
autocomplete_fields = ["tags"]
- 설명: 태그 선택 시, 기존 태그 목록을 자동완성 방식으로 입력할 수 있게 합니다.
- 장점: 태그가 많을수록 성능이 좋고, UX가 개선됩니다.
- 필수 조건:
Tag
모델에는__str__()
메서드가 잘 정의되어 있어야 함. - 자동완성 제안기능으로 기존에 존재하는 태그를 쉽게 선택 가능합니다.
레스토랑 등록할때는 레스토랑메뉴와 레스토랑 이미지가 안보입니다.
수정할때 나타납니다.